範圍解析運算子(Scope Resolution Operator)以兩個冒號::呈現。
至於為何用(::)來表示,根據官方文件說明,這個詞在希伯來文就是雙冒號的意思
(原來如此)。
為了區分物件和類的訪問,static關鍵字修飾屬性和方法,可以在未進行實體化時使用靜態屬性/方法
類::static屬性名;
類::static方法名();
聲明類屬性或方法為靜態
class Wallet{
//屬性
private static $count =0;
//方法
public static function showClass(){
echo Wallet::$count;
}
}
1.類可以直接訪問靜態方法(無須實例化的過程)
Wallet::showClass();
//輸出 0
2.靜態屬性不能通過一個已實例化的物件來訪問(但靜態方法可以)
$s = new Wallet();
$s->count = 100 ;
//報錯:PHP Notice: Accessing static property Wallet::$count as non static
3.修改原本的code,在靜態方法內部定義$this
public static function showClass(){
echo Wallet::$count;
$this->charge=10;
}
//vscode提醒$this can not be used in static methods
由於靜態方法本質是給類訪問,所以不允許在靜態方法內部定義$this物件
另外,在PHP7特別加註了警告,未來將可能移除靜態方式訪問靜態方法。
In PHP 7, calling non-static methods statically is deprecated, and will generate an E_DEPRECATED warning. Support for calling non-static methods statically may be removed in the future.
self專門使用於類內部的方法,代替類名的寫法加上::,用戶方便修改類名時使用
class Wallet{
//屬性
private static $count =0;
//方法
public static function showClass(){
echo Wallet::$count;
echo self::$count; //代替類名
}
}
Wallet::showClass();
//輸出
00
不妨參考PHP官方文件https://www.php.net/manual/en/language.oop5.static.php
今天的static與self的講解先說到這邊~~